\subsection{Windows}

\subsubsection{Scheduler}
Al principio MS-DOS y Windows eran monoprogramados, es decir que no utilizaban ningún scheduler. 
Luego, Windows 3.1x incorporó un sistema de scheduler sin desalojo. Esto significaba que cada programa corría de principio a fin sin ser interrumpido, 
lo que provocaba que el sistema dependiera de que cada programa terminara. Más tarde, Windows 95 introdujo un scheduler con desalojo, pero permitiendo que las 
aplicaciones de 16 bits corrieran sin desalojo por un tema de compatibilidad hacia atrás. A este último scheduler se lo consideraba un poco rudimentario.\\
Hace poco más de 10 años, aparecieron los sistemas operativos de Microsoft basados en NT, los cuales usaban, y aún usan (como es el caso del Windows XP) 
una multicola con feedback que da preferencia a procesos cortos, interactivos y los procesos que usan mucho dispositivos de E/S. 
En este planificador de tareas existían 32 prioridades, donde las primeras 16 se las consideraba "normales", y las otras 16 prioridades eran de "semi" tiempo real. 
Para administrar los procesos según su prioridad, la estructura utilizada es una "Lista de listos del Dispatcher" (Dispatcher Ready List), la cual es un arreglo 
donde cada posición representa la cabeza de la lista de procesos con esa prioridad. De esta forma el scheduler lo que hace es un round robin ponderado, 
permitiendo correr más tiempo a los procesos con más prioridad. Con respecto a los procesos de prioridad alta , se dice que son de "semi" tiempo real 
(en inglés "soft" real-time) ya que NT y sus derivados no fueron sistemas pensados para ser de tiempo real. Es así que las latencias de los procesos con estas 
últimas prioridades pueden llegar a ser muy altas como para ser de tiempo real. Para los procesos con las primeras prioridades es posible para el usuario cambiarlas, 
mientras que las últimas sólo pueden ser cambiadas si se tienen privilegios. Para cumplir con las preferencias nombradas anteriormente, el kernel analiza continuamente, 
no sólo en los cambios de proceso, si el proceso esta haciendo uso de métodos de entradas tales como el mouse ,el teclado o los discos, lo cual permite decidir 
si un proceso es de tipo interactivo o ligado a E/S, y así definirle una prioridad mas alta. Sin embargo antes NT resolvía dar más prioridad al proceso en 
"foreground", osea que se estuviera usando en ese momento. Como después no fue más asi, se resolvió simplemente darle un "quantum" más largo al proceso en el frente.\\
Lanzado en 2007, Windows Vista introdujo mejoras en términos de medición y obtención de estadísticas de uso, lo que permite una mejor asignación de tiempos o quantums. 
Además, se dejó de asignar a un proceso quantum medidos en cantidad de tiempo, sino que se le asignan en cantidad de ciclos cpu. En este sistema operativo se mide cuantos 
ciclos usó ese proceso sin contar los que usó el sistema y los que se usaron por interrupciones. Esto último hace que el reparto de quantums sea mas justo y el comportamiento 
de las aplicaciones sea mas predecible. Sumado a esto, se hizo un servicio de scheduler para los procesos multimedia, ofreciendo reproducciones de contenido multimedia sin cortes, 
haciendo que procesos de tipo batch no roben recursos a las aplicaciones multimedia.

\subsubsection{Administración de memoria}
La administración de memoria es un punto central en el desarrollo de cualquier sistema operativo. A lo largo de los años, Microsoft ha introducido numerosos cambios en la administración de memoria 
debido a que el desarrollo de sus sistemas operativos estuvo basado en la arquitectura Intel, y como sabemos, con cada nuevo modelo de procesador, Intel fue introduciendo nuevas funcionalidades 
para el manejo y protección de la memoria. No nos detendremos a hacer un repaso por la historia de los procesadores de esta familia, pues asumimos que a esta altura estamos familiarizados con 
los términos y mecanismos de la arquitectura IA32. Por eso pasaremos a dar una breve descripción de cómo Windows NT (los sistemas modernos de microsoft se basan en windows NT) hace uso de estos 
recursos para administrar la memoria.\\
Desde el punto de vista del programador, Windows NT ofrece a las aplicaciones un espacio de direccionamiento plano de 32bits de direccionamiento. No se encuentra segmentado, sino que es un espacio 
contínuo. WinNT hace uso de los mecanismos de protección ofrecidos por el procesador. En otras palabras, un proceso no puede interferir en el espacio de memoria de otro procesos. Esto se logra asignando 
distintas porciones de memoria a los procesos. En WinNT, la memoria es dividida en dos mitades, siendo los 2Gb más significativos reservados para el kernel, y los 2Gb restantes para los procesos de usuario. 
Sin embargo el espacio de direcciones no esta separado para cada proceso, por lo que la imagen del kernel es común para todos los procesos (obviamente protegida contra escritura o lectura de procesos de usuario). 
El sistema de DLLs (por ejemplo KERNEL32.dll) y otras dll's se mapean en modo usuario para que todos los procesos puedan acceder ya que es infeciente tener copias de la misma dll para cada procesos.\\
Compartir el espacio del kernel y las dll's recibe el nombre de \textit{implicit sharing}. Sin embargo muchas veces dos procesos necesitan compartir información explícitamente. Windows NT permite esto 
a través de archivos especiales en memoria (\textit{memory-mapped files}). Si dos o más procesos quieren compartir información, sólo tienen que mapear el mismo archivo en sus espacios de direcciones. 
De esta forma no se crea ningún archivo físicamente en el disco.\\
Un aspecto importante de cualquier sistema operativo es el manejo de la memoria virtual. Para implementar el manejo de memoria virtual, WindowsNT utiliza distintas estructuras. En principio necesita 
conocer si la dirección a la cual se accede se encuentra en memoria o debe ser buscada en un medio de almacenamiento secundario. Para ello hace uso de las estructuras de páginas de tablas provistas por el 
procesador. Cuando se intenta acceder a una página que no esta presente en memoria, el manejador de page fault (\textit{page fault handler} se encarga de traer la información a memoria física.\\
Más especificamente, dependiendo del tipo de información que contenga la página, el handler traerá la información desde donde corresponda. Por ejemplo, si la página contiene código de un ejecutable o de una 
dll, se trae la información desde el archivo ejecutable o dll, mientras que si la página es de datos, se utiliza el \textit{swap file} (similar a Linux).\\
Es necesario por supuesto que el sistema conozca y lleve cuenta del espacio libre en memoria física si es que va a llevar a cabo el manejo de memoria virtual de foram eficiente. Para ello Windows guarda 
dicha información en una estructura de datos del kernel llamada \textit{Page Frame Database} o PFD. La PFD mantiene también una lista FIFO de las páginas en memoria para decidir luego cual puede desechar 
a la hora de hacer lugar para una nueva página.\\
Antes de deshacerse de la página si es que requiere hacer esto el sistema, Windows controla que la página no haya sido modificada (\textit{dirty}). Si efectivamente fue modificada, entonces la guardará 
en memoria secundaria para traerla nuevamente a memoria física cuando sea necesario. Si la página no esta siendo compartida, la PFD contiene un puntero a la PTE (\textit{Page Table Entry}) para que 
el sistema pueda marcar dicha PTE como inválida si es que decide desalojar la página. Contrariamente, si la página esta siendo compartida, la PFD apunta a entrada llamada PROTOPTE, junto con un contador 
de referencias. Sólo cuando las referencias han llegado a 0 es que se puede desalojar la página. En general la PFD mantiene el estado de todas las páginas presentes en memoria física.\\
La PFD es un arreglo de entradas de 24 bytes, cada una para una página física. El tamaño de dicho array es entonces igual a la cantidad de páginas físicas (dicha cantidad se mantiene en una variable llamada 
\textit{MmNumberOfPhysicalPages}, mientras que el arreglo es apuntado por \textit{MmpfnDatabase}). Una página puede estar en varios estados, por ejemplo puede estar \textit{in-use}, \textit{free}, \textit{free but dirty}, etc. 
Cada entrada en la PFD forma una lista doblemente enlazada con otras entradas, dependiendo del estado de la página. Por ejemplo, una entrada que representa una página libre, apunta a otras entradas de páginas libres 
formando una lista, como se puede ver en la siguiente figura.
\begin{center}
  \includegraphics[totalheight=0.3\textheight]{./imagenes/pfd.png}
\end{center}

Junto con las páginas libres, Windows NT también necesita tener control del espacio de direccionamiento virtual de cada proceso. Cada vez que un proceso hace uso de un bloque de memoria, por ejemplo para 
cargar una dll, Windows NT debe chequear y buscar un bloque libre en el espacio de direcciones virtuales, y actualizar las tablas adecuadamente. El lugar más obvio para administrar esta información es en 
las tablas de paginación de cada proceso (cada proceso posee su propio juego de tablas).\\
Existen 1 millón de páginas, y si por cada entrada en la tabla se usan 4 bytes, tenemos que cada proceso necesita 4MB de ram solamente para administrar la memoria, una cantidad importante. La solución es 
que las propias tablas de páginas sea removidas de la memoria y vueltas a cargar cuando se necesita. Pero esto es bastante ineficiente si cada vez que el proceso requiere reservar memoria hay que cargar las 
tablas de nuevo en memoria. Para agilizar y solucionar esto, Windows NT mantiene un ábol binario de búsqueda conteniendo la información acerca del espacio virtual reservado para cada proceso. Un nodo de este árbol 
es llamado \textit{Virtual Address Descriptor} o VAD. Para cada bloque de memoria que Windows NT reservera para el proceso, se agrega una entrada al árbol. El VAD contiene el rango de direcciones que fue 
reservado para el proceso, es decir el principio y el final del bloque, asi como los punteros a sus hijos y padre (recordemos que es un árbol). Este árbol es almacenado en el \textit{Process Enviroment Block} (algo 
similar al BCP visto en la materia)